package modelo;

import godzilla.ciudad.*;
import godzilla.ciudad.administradores.Juego;
import godzilla.ciudad.administradores.Jugador;
import godzilla.ciudad.desastres.Godzilla;
import godzilla.ciudad.estructuras.Estructura;
import godzilla.ciudad.estructuras.NoSePuedeConstruirAquiException;
import godzilla.ciudad.estructuras.Superficie;
import godzilla.ciudad.estructuras.TerrenoVacio;

import java.io.File;
import java.io.IOException;
import java.util.Observable;

import vista.RepresentacionEstructura;

public class ModeloDelJuego extends Observable {

	private Estructura estructuraPreparada;
	private Jugador jugador;
	private Juego juego;
	private boolean preparadoParaInundar;
	private boolean preparadoParaConstruir;
	private boolean preparadoParaDestruir;
	private Godzilla godzilla;

	public ModeloDelJuego(int anchoDelMapa, int altoDelMapa, int dineroInicial, String nombreDelJugador) {
    	
    	jugador = new Jugador(nombreDelJugador,dineroInicial);
    	juego = new Juego(anchoDelMapa,altoDelMapa);
    	iniciarJuego(); 	

 
    	
    }
	
	private void iniciarJuego() {
    	juego.asignarJugador(jugador);
    	estructuraPreparada = new TerrenoVacio();
    	preparadoParaInundar = false;
    	preparadoParaConstruir = false;
    	preparadoParaDestruir = false;
    	godzilla=new Godzilla();
		
	}

	public ModeloDelJuego(String nombreDelJugador) {
		this.cargarJuego(nombreDelJugador);
		iniciarJuego();
	}

	private void cargarJuego(String nombreDelJugador) {
		String contenidoSave = cargarDatosDe(nombreDelJugador);
		EstadoDelJuego estadoDelJuego = extraerContenidoJSON(contenidoSave);
		this.juego = estadoDelJuego.juego;
		this.jugador = estadoDelJuego.jugador;
		
	}

	private EstadoDelJuego extraerContenidoJSON(String contenidoSave) {
		EstadoDelJuego estado = new EstadoDelJuego();
		estado.obtenerObjetoDesdeJSON(contenidoSave);
		return estado;
	}

	private String cargarDatosDe(String nombre) {
		File archivo = new File("savegames/" + nombre + ".txt");
		String contenido = null;
		LectorDeArchivos lector = new LectorDeArchivos();
		if (archivo.exists()){
			try {
				contenido = lector.leer("savegames/" + nombre + ".txt");
			} catch (IOException e) {

				e.printStackTrace();
			}
		}
		
		return contenido;
		
	}

	public int ancho() {

		return juego.dimensionMapaX();
	}

	public int alto() {

		return juego.dimensionMapaY();
	}

	public void realizarAccionPreparada(Ubicacion posicion) {

		Punto punto = new Punto(posicion.x,posicion.y);

		if (preparadoParaInundar) jugador.inundar(punto);

		if (preparadoParaConstruir) try {
			jugador.construir(this.estructuraPreparada.duplicar() , new Punto(posicion.x , posicion.y));
		} catch (NoSePuedeConstruirAquiException e) {
			
		}
		
		if (preparadoParaDestruir) {
			jugador.destruirEstructuraEn(punto);
		}
		
        setChanged();
        this.notifyObservers();
		
	}

	public void prepararEstructuraParaConstruir(RepresentacionEstructura estructura) {
		preparadoParaInundar = false;
		preparadoParaConstruir = true;
		preparadoParaDestruir = false;
		this.estructuraPreparada = estructura.estructuraRealAsignada();
		
	}

	public Superficie getSuperficiePlantaBaja(Ubicacion posicion) {

		return juego.verSuperficieEn(new Punto(posicion.x, posicion.y));	
        
	}

	public Superficie getSuperficieSubterranea(Ubicacion posicion) {

		return juego.verSuperficieSubterraneaEn(new Punto(posicion.x, posicion.y));	
        
	}

	public void avanzarTurno() {

		juego.avanzarTurno();
		if (godzilla.estaDespierto()){
			godzilla.atacarCiudad();


	}
        setChanged();
        this.notifyObservers();
		
	}

	public int turnosTranscurridos() {

		return juego.turnosTranscurridos();
		
	}

	public int dineroQuePoseeElJugador() {
		return jugador.dinero();
	}

	public void prepararParaInundar() {
		preparadoParaInundar = true;
		preparadoParaConstruir = false;
		preparadoParaDestruir = false;
		
	}

	public void prepararParaDestruir() {
		preparadoParaInundar = false;
		preparadoParaConstruir = false;
		preparadoParaDestruir = true;
		
	}

	public void despertarAGodzilla() {


		this.godzilla = new Godzilla();
		juego.esAtacadoPorGodzilla(godzilla);
		godzilla.atacarCiudad();

		
		
	}

	public Superficie verSuperficiePisadaPorGodzilla() {
		return godzilla.superficieQueEstaPisando();
	}

	public void guardarJuego() {
		
		EscritorDeArchivos escritor = new EscritorDeArchivos();
		EstadoDelJuego estadoDelJuegoActual = new EstadoDelJuego();
		estadoDelJuegoActual.juego = juego;
		estadoDelJuegoActual.jugador = jugador;
		String juegoASalvar = estadoDelJuegoActual.toJSONString();
		String ruta = "savegames/" + jugador.nombre() + ".txt";
		escritor.escribir(juegoASalvar,ruta);
		
		
		
	}

}
